home *** CD-ROM | disk | FTP | other *** search
/ Nebula 2 / Nebula Two.iso / NextAnswers / 1722_Using_autorelease_pools_without_EOF.rtfd / PoolApplication.m < prev    next >
Text File  |  1995-04-28  |  2KB  |  89 lines

  1. /*
  2.  *  This Application subclass provides support for NSAutoreleasePools.
  3.  *  If you have an application that uses Foundation but not EOF you
  4.  *  need to make this class your Application class, otherwise your
  5.  *  application will have a lot of serious memory leaks.
  6.  *
  7.  *  No guarantee is made for the fitness of this code for any particular
  8.  *  use.  No warranty expressed or implied.  Use at your own risk!
  9.  *
  10.  *  Randy Tidd
  11.  *  NeXT Premium Developer Support
  12.  */
  13. #import "PoolApplication.h"
  14.  
  15. @implementation PoolApplication : Application
  16.  
  17. - (void)_setupAutoreleasePool
  18. {
  19.     autoreleasePool = [[NSAutoreleasePool alloc] init];    
  20.     disableCount = 0;
  21. }
  22.  
  23. + new
  24. {
  25.     id poolApplication;
  26.  
  27.     poolApplication = [super new];
  28.  
  29.     [poolApplication _setupAutoreleasePool];
  30.  
  31.     return poolApplication;
  32. }
  33.  
  34. /*
  35.  *  Release the current pool, and create a new one.
  36.  */
  37. - (void)_releasePool
  38. {
  39.     if(disableCount<= 0) {
  40.         [autoreleasePool release];
  41.         autoreleasePool = [[NSAutoreleasePool alloc] init];
  42.     }
  43. }
  44.  
  45. /*
  46.  *  Release the current pool before and after every event.
  47.  */
  48. - sendEvent:(NXEvent *)event
  49. {
  50.     [self _releasePool];
  51.  
  52.     [super sendEvent:event];
  53.  
  54.     [self _releasePool];
  55.  
  56.     return self;
  57. }
  58.  
  59. /*
  60.  *  Need to disable the autorelease pool during modal loops otherwise
  61.  *  objects that are involved in the modal loop will be freed prematurely.
  62.  *  We need to have a "disable count" rather than a boolean flag because
  63.  *  we can have nested modal sessions.
  64.  */
  65. - (int)runModalSession:(NXModalSession *)session
  66. {
  67.     int retVal;
  68.  
  69.     disableCount++;
  70.     retVal = [super runModalSession:session];
  71.     disableCount--;
  72.  
  73.     return retVal;
  74. }
  75.  
  76. - (int)runModalFor:theWindow
  77. {
  78.     int retVal;
  79.  
  80.     disableCount++;
  81.     retVal = [super runModalFor:theWindow];
  82.     disableCount--;
  83.  
  84.     return retVal;
  85. }
  86.  
  87.  
  88. @end
  89.